<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>XiunoPHP 开发手册</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta name="keywords" content="XiunoPHP 开发手册" />
	<meta name="description" content="XiunoPHP 开发手册 " />
	<meta name="generator" content="Xiuno BBS" />
	<meta name="author" content="Xiuno Team" />
	<meta name="copyright" content="2008-2012 xiuno.com" />
	<meta name="MSSmartTagsPreventParsing" content="True" />
	<meta http-equiv="MSThemeCompatible" content="Yes" />
	<link href="common.css" type="text/css" rel="stylesheet" />
</head>

<body class="bg1">
	<div class="width big">
		<h1>XiunoPHP 深入篇</h1>
		<p>页内导航</p>
		<ul>
			<li><a href="#link1">一、Database</a></li>
			<li><a href="#link2">二、缓存 Cache</a></li>
			<li><a href="#link3">三、DEBUG</a></li>
		</ul>
		
		<p>如果您不打算使用 MVC 模式开发，那么可以继续看下面的内容。</p>
		
		<h1><a name="link1"></a>一、Database </h1>
	
		<p>在【入门篇】，我们已经学会了通过 model 来操作DB，这里我们来看看使用 XiunoPHP 如何“粗暴”的操作DB。</p>
		<ol>
			<li>如何使用 Database class：
<pre>
&lt;?php
	define('DEBUG', 2); // 调试模式: 0:关闭; 1: 线上调试模式; 2: 本地开发详细调试模式;
	define('FRAMEWORK_PATH', './xiunophp/');
	include FRAMEWORK_PATH.'core.php';
	core::init();

	// 配置
	$dbconf = array(
		'master' =&gt; array (
			'host' =&gt; 'localhost',
			'user' =&gt; 'root',
			'password' =&gt; 'root',
			'name' =&gt; 'test',
			'charset' =&gt; 'utf8',
			'tablepre' =&gt; 'my_',
			'engine'=&gt;'MyISAM',
		),
		'slaves' =&gt; array (
		)
	);
	
	// 实例化
	$db_mysql = new db_mysql($dbconf);
	
	// 获取一条记录
	$db-&gt;get("blog-blogid-123");
	
	// 设置一条记录
	$blog = array('cateid'=&gt;1, 'subject'=&gt;'标题', 'message'=&gt;'内容');
	$db-&gt;set("blog-blogid-123", $blog);
	
	// 删除一条数据
	$db-&gt;delete("blog-blogid-123");
	
				
	// 取列表数据，第一个参数为 表名，第二个参数为主键（多个写成数组），第三个参数为条件，第四个参数为排序，第五个参数为结果集 $start, 第六个参数为 $limit。
	// 通过 Model 来操作表可以省去第一个和第二个参数。
	$bloglist = $db-&gt;index_fetch('blog', 'blogid', array('cateid' =&gt; 1), array(), 0, 10);
	$bloglist = $db-&gt;index_fetch('blog', 'blogid', array('blogid' =&gt; array('&gt;', 123)), array(), 0, 10);
	
	// 取记录总数
	$db-&gt;count('blog');
	
?&gt;
</pre>
		</li>
		
		<li>主从模式(Master-Slave)<br />
			当访问量增大，读写压力随着增大，单台 Database 越来越吃力的时候，可以考虑 Master-slave 模式来分散压力。</br >
			部署 Master-Slave 后，拷贝数据到各台 Slave，然后配置文件，格式如下：
<pre>
&lt;?php
	// 主从配置格式
	$dbconf = array(
		'master' =&gt; array (
			'host' =&gt; '192.168.1.100',
			'user' =&gt; 'root',
			'password' =&gt; 'root',
			'name' =&gt; 'test',
			'charset' =&gt; 'utf8',
			'tablepre' =&gt; 'bbs_',
			'engine'=&gt;'MyISAM',
		),
		'slaves' =&gt; array (
			array (
				'host' =&gt; '192.168.1.101',
				'user' =&gt; 'root',
				'password' =&gt; 'root',
				'name' =&gt; 'test',
				'charset' =&gt; 'utf8',
				'tablepre' =&gt; 'bbs_',
				'engine'=&gt;'MyISAM',
			),
			array (
				'host' =&gt; '192.168.1.102',
				'user' =&gt; 'root',
				'password' =&gt; 'root',
				'name' =&gt; 'test',
				'charset' =&gt; 'utf8',
				'tablepre' =&gt; 'bbs_',
				'engine'=&gt;'MyISAM',
			),
			array (
				'host' =&gt; '192.168.1.103',
				'user' =&gt; 'root',
				'password' =&gt; 'root',
				'name' =&gt; 'test',
				'charset' =&gt; 'utf8',
				'tablepre' =&gt; 'bbs_',
				'engine'=&gt;'MyISAM',
			)
		);
		
	// 实例化
	$db_mysql = new db_mysql($dbconf);
?&gt;
</pre>
		</li>
		<li>
			数据分片(Chunk)<br />
			如果主从还不能满足您的大数据量业务需求，那么您可以考虑使用数据分片。<br />
			数据分片不是一件轻松的事情，需要在业务需求刚开始的时候就考虑好分片策略，一旦定下来，不能更改。<br />
			分片以后，数据和索引都存储在不同的服务器，一般是按照ID范围进行分片。那么 maxid, count 就是一个比较麻烦的事情，还好 XiunoPHP 已经为您考虑好了这些。<br />
			您需要指定一台 arbiter server，用来保存 maxid, count 这些全局的数据。然后作者考虑到这不是常见需求，不打算继续写在文档里了，请到论坛进行交流吧。
		</li>
	</ol>
	
	<h1><a name="link2"></a>二、缓存 Cache</h1>

	<p>在高并发访问下，开启 Cache 会大大加速应用的速度，建议在高负载项目中开启，目前比较流行的Cache已经被XiunoPHP良好集成。</p>
	<ol>
		<li>
			支持的 Cache:
			XiunoPHP Cache 采用单行缓存数据，与 Database 的单行读写数据接口保持高度一致，这样可以做到针对上层透明，即可以随时开启、关闭Cache，而不会影响系统运行。
			目前支持 memcached、ttserver、EA，通过添加驱动文件，可以很方便的支持其他 Cache。
		</li>
		<li>
			如何使用：
<pre>
&lt;?php
	define('DEBUG', 2); // 调试模式: 0:关闭; 1: 线上调试模式; 2: 本地开发详细调试模式;
	define('FRAMEWORK_PATH', './xiunophp/');
	include FRAMEWORK_PATH.'core.php';
	core::init();
	
	$cacheconf = array (
		'enable'=&gt;TRUE,
		'type'=&gt;'memcache',
		'memcache'=&gt;array (
			'host'=&gt;'127.0.0.1',
			'port'=&gt;'11211',
		)
	);
	$cache = new cache_memcache($cacheconf);
	
	// 取一条记录
	$user = $cache-&gt;get("user-uid-$uid");
	
	// 增加一条记录:
	$uid = $cache-&gt;maxid('user');
	$cache-&gt;set("user-uid-$uid", array('username'=&gt;'admin', 'email'=&gt;'xxx@xxx.com'));
	$cache-&gt;maxid('user', '+1');
	
	// 存一条记录，覆盖写入
	$cache-&gt;set("user-uid-$uid", array('username'=&gt;'admin', 'email'=&gt;'xxx@xxx.com'));
	
	// 删除一条记录
	$cache-&gt;delete("user-uid-$uid");
	
	// 遍历
	$uid = $cache-&gt;maxid('user');  // 取最大的UID
	$uids = array();
	for($i=0; $i&lt;$uid; $i++) $uids[] = $i;
	$userlist = $cache-&gt;get($uids);
	
	// 取记录总数
	$cache-&gt;count('user');

	// 清除所有记录
	$cache-&gt;flush();
?&gt;
</pre>
		<p>你也许发现 DB, Cache 的使用时如此的一致，是的，这正是 XiunoPHP 努力的结果。</p>
	
		<li>
			分布式 Cache<br />
			经过反复权衡，我们不打算从 PHP 层面支持分布式 Cache，主要考虑到连接花费大量的时间，但是您可以通过系统层面来支持分布式 Cache：<br />
			* 局域网内多台 cache server, 本机(127.0.0.1)，写操作通过UDP同步来保持一致性（Memcached UDP组播服务，可能存在安全性问题）。<br />
			* 单台 proxy 管理多台 worker。例如 Membase 的 proxy-worker 模式。
		</li>
	</ol>
		
	<h1><a name="link3"></a>三、DEBUG</h1>
	<ol>
		<li>
			定义 DEBUG 来告诉 XiunoPHP 的错误如何处理。<br />
			下面通过一个例子，触发一个Notice错误，新建文件 testerror.php。
<pre>
&lt;?php
	define('DEBUG', 2); // 调试模式: 0:关闭; 1: 线上调试模式; 2: 本地开发详细调试模式;
	define('FRAMEWORK_PATH', './xiunophp/');
	include FRAMEWORK_PATH.'core.php';
	core::init();
	$a = $a + 1; // $a 未定义，会触发一个 Notice 错误
?&gt;
</pre>
		</li>
		<li>
			浏览器访问：http://localhost/testerror.php，结果：<br />
			<img src="debug_2.jpg" class="border" /><br />
		</li>
		<li>
			命令行访问：php D:/www/testerror.php，结果：<br />
			<img src="debug_1.jpg" class="border" /><br />
		</li>
		<li>
			另外，我们考虑到了 ajax 请求的时候，一般要求服务端返回的格式为JSON，浏览器访问：http://localhost/testerror.php?ajax=1，结果：<br />
			<img src="debug_3.jpg" class="border" /><br />
		</li>
		<li>在应用上线后，将 DEBUG 关闭，防止敏感信息泄露。</li>
	</ol>

	</div>
	<br />
	<br />
	<br />
</body>
</html>
